package enemies;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import Main.GamePanel;
import Screens.TelaJogo;
import Screens.TelaTreinamento;
import Utils.Constantes;
import Utils.TipoCoord;

public class Enemy {
    
    public BufferedImage charset = null;
    
	public float x;
	
	public float y;
    int velX, velY;
    int frameTime;
    long tempo;
    int anim;
    int character;
    int frame;
    int charx,chary;    
	public int life, lifeMax;
    int[] caminhoX;
    int[] caminhoY;
    int posAtual;
    int raio;
    int cadencia;
    int dano;
	public boolean vivo;
    int direcao;
    public static final int DIREITA = 0;
    public static final int BAIXO = 1;
    public static final int ESQUERDA = 2;
    public static final int CIMA = 3;
	int vel;
	public int timer = 0;
	public ArrayList<TipoCoord> path = null;
	public int recompensa;
	public int posNaLista = -1;
	public boolean isSuicidio = false;
    
    public Enemy(BufferedImage charset, ArrayList<TipoCoord> caminho, int pos, int life, int vel, int raio, int cadencia, int dano, int recompensa){      
        frameTime = 100;        
        tempo = 0;        
        anim = 0;      
        charx = 0; 
        chary = 0;        
        frame = 0;
        this.charset = charset;  
		posAtual = 0;
		this.life = life;
		lifeMax = life;
		this.posNaLista = pos;
		setPath(caminho, vel);
        this.raio = raio;
        this.cadencia = cadencia;
        this.dano = dano;
        vivo = true;
        this.recompensa = recompensa;
        isSuicidio = false;
    }   
    
	

	public void setPath(ArrayList<TipoCoord> caminho, int velocidade) {
    	this.path = caminho;
    	x = path.get(0).x; 
		y = path.get(0).y;

    	if (x < 0){
    		x -= posNaLista*48;
    		direcao = DIREITA;
			this.velX = velocidade;
			this.velY = 0;
    	} else if (y < 0){
    		y -= posNaLista*48;
    		direcao = BAIXO;
			this.velX = 0;
			this.velY = velocidade;
    	} else if (x > 720){
    		x += posNaLista*48;
    		direcao = ESQUERDA;
			this.velX = -velocidade;
			this.velY = 0;
    	} else if (y > 480){
    		y += posNaLista*48;
    		direcao = CIMA;
			this.velX = 0;
			this.velY = -velocidade;
    	}
    }
    
    @SuppressWarnings("static-access")
	public void SimulaSe(long diftime) {
        tempo += diftime;
        boolean ultimoPto=false;
        
        x += (diftime*velX)/1000.0f;
        y += (diftime*velY)/1000.0f;
        if(posAtual == path.size()-2){
        	switch(direcao){
        	case 0:
        		ultimoPto = x >= path.get(path.size()-1).x;
        		break;
        	case 1:
        		ultimoPto = y >= path.get(path.size()-1).y;
        		break;
        	case 2:
        		ultimoPto = x <= path.get(path.size()-1).x;
        		break;
        	case 3:
        		ultimoPto = y <= path.get(path.size()-1).y;
        		break;
        	}
        }
        if (!ultimoPto){
	        switch(direcao){
	        case DIREITA:
	        	if(x >= path.get(posAtual+1).x){
	            	posAtual++;	      
	            	x = path.get(posAtual+1).x;
	            	if(y <= path.get(posAtual+1).y){
	            		direcao=1;
	            		velY = velX;
	            		velX= 0;
	            	}else{
	            		direcao=3;
	            		velY = -velX;
	            		velX= 0;
	            	}
				}
	        	break;
	        case BAIXO:
	        	if(y >= path.get(posAtual+1).y){
	        		posAtual++;
	        		y = path.get(posAtual+1).y;
	        		if(x <= path.get(posAtual+1).x){
	            		direcao=0;
	            		velX = velY;
	            		velY= 0;
	        		}else{
	            		direcao=2;
	            		velX = -velY;
	            		velY= 0;
	        		}
	            }
	        	break;
	        case ESQUERDA:
	        	if(x <= path.get(posAtual+1).x){
	            	posAtual++;
	            	x = path.get(posAtual+1).x;
	            	if(y <= path.get(posAtual+1).y){
	            		direcao=1;
	            		velY = -velX;
	            		velX = 0;
	            	}else{
	            		direcao=3;
	            		velY = velX;
	            		velX= 0;
	            	}
	            }        	
	        	break;
	        case CIMA:
	        	if(y <= path.get(posAtual+1).y){
	        		posAtual++;
	        		y = path.get(posAtual+1).y;
	        		if(x <= path.get(posAtual+1).x){
	            		direcao=0;
	            		velX = -velY;
	            		velY= 0;
	        		}else{
	            		direcao=2;
	            		velX = velY;
	            		velY= 0;
	        		}
	            }
	        	break;      	
	        }   
	        float torreX = 0, torreY = 0;
			int j = 0;
			this.timer += diftime;    
			if (timer >= cadencia) {
				timer = 0;
				if(GamePanel.instance.TELA_ATIVA == GamePanel.instance.TELA_JOGO){
			        for (int i = 0; i < TelaJogo.listasDeTorres.size(); i++) {
			        	if(TelaJogo.listasDeTorres.get(i).fixada){
							if ((Math.abs(TelaJogo.listasDeTorres.get(i).x - this.x) <= raio)
									&& (Math.abs(TelaJogo.listasDeTorres.get(i).y - this.y) <= raio)) {
								torreX = TelaJogo.listasDeTorres.get(i).x;
								torreY = TelaJogo.listasDeTorres.get(i).y;
								j = i;
								i = TelaJogo.listasDeTorres.size();
							}
			        	}
					}
					if (torreX != 0 && torreY != 0) {
	//					System.out.print("TORRE: "+TelaJogo.listasDeTorres.get(j).life+"  -  "+this.dano+" = ");
						TelaJogo.listasDeTorres.get(j).life -= this.dano;
						//System.out.println(TelaJogo.listasDeTorres.get(j).life);
						if (TelaJogo.listasDeTorres.get(j).life <= 0) {
							TelaJogo.listasDeTorres.get(j).viva = false;

							TelaJogo.adicionaChamuscadoNoBuffer((int) (TelaJogo.listasDeTorres.get(j).x -Constantes.chamuscado.getWidth()/2),
									(int) (TelaJogo.listasDeTorres.get(j).y -Constantes.chamuscado.getHeight()/2));



						}
					}
				
				}else{
//					System.out.println("tamanho da lista de treinamento"+TelaTreinamento.listasDeTorresTreinamento.size());
					for (int i = 0; i < TelaTreinamento.listasDeTorresTreinamento.size(); i++) {
			        	if(TelaTreinamento.listasDeTorresTreinamento.get(i).fixada){
							if ((Math.abs(TelaTreinamento.listasDeTorresTreinamento.get(i).x - this.x) <= raio)
									&& (Math.abs(TelaTreinamento.listasDeTorresTreinamento.get(i).y - this.y) <= raio)) {
								torreX = TelaTreinamento.listasDeTorresTreinamento.get(i).x;
								torreY = TelaTreinamento.listasDeTorresTreinamento.get(i).y;
								j = i;
								i = TelaTreinamento.listasDeTorresTreinamento.size();
							}
			        	}
					}
					if (torreX != 0 && torreY != 0) {
	//					System.out.print("TORRE: "+TelaJogo.listasDeTorres.get(j).life+"  -  "+this.dano+" = ");
						TelaTreinamento.listasDeTorresTreinamento.get(j).life -= this.dano;
						//System.out.println(TelaJogo.listasDeTorres.get(j).life);
						if (TelaTreinamento.listasDeTorresTreinamento.get(j).life <= 0) {
							TelaTreinamento.listasDeTorresTreinamento.get(j).viva = false;
						}
					}
				}
        
			}
        } else {  
        	int vida = -1;
        	if(GamePanel.instance.TELA_ATIVA == GamePanel.instance.TELA_JOGO){
        		TelaJogo.lifeBase-=this.life;
        		vida = TelaJogo.lifeBase;
        	}else{
        		TelaTreinamento.lifeBase-=this.life;
        		vida = TelaTreinamento.lifeBase;
        	}
        	Constantes.soundplayer.playTrack(Constantes.SFX_BASEHIT);
        	if (vida > 0){
        		GamePanel.shakeScreen = true;
        	}
        	isSuicidio = true;
        	
        	life = 0;
        	vivo = false;
        }

        frame = ((int)(tempo/frameTime))%4;
	}

	public void DesenhaSe(Graphics2D dbg) {
		  int posx = (int)x; 
		  int posy = (int)y;
		  switch (direcao) {
				case 0:
					anim = 2;
					break;
				case 1:
					anim = 0;
					break;
				case 2:
					anim = 3;
					break;
				case 3:
					anim = 1;
					break;
		  }
		
		dbg.drawImage(charset, posx-24, posy-24, posx+24, posy+24, frame*48, anim*48, frame*48+48, anim*48+48, null);
		
		dbg.setColor(Color.green);
		dbg.fillRect(posx - 15, posy - 24, (int) (24.0f*life / lifeMax), 2);
	}

}
